package com.ruoyi.common.utils.file;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;

/**
 * 文件上传工具类
 *
 * @author shiseido
 */
public class OssUploadUtils {

    /**
     * 上传文件到 OSS
     *
     * @param file 文件
     * @return 文件访问 URL
     */
    public static final String uploadFile(MultipartFile file,
                                          String endpoint,
                                          String accessKeyId,
                                          String accessKeySecret,
                                          String bucketName,
                                          String folderPath) {
        try {

            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            // 生成唯一的文件名 時間戳
            String fileName = DateUtils.dateTimeNow() + "-" + file.getOriginalFilename();
            InputStream inputStream = file.getInputStream();

            // 上传文件
            ossClient.putObject(bucketName, folderPath + "/"  + fileName, inputStream);

            // 关闭OSSClient。
            ossClient.shutdown();

            String url = "https://" + bucketName + "." + endpoint + "/" + folderPath + "/" + fileName;

            // 返回文件的访问 URL
            return url;

        } catch (IOException e) {
            throw new RuntimeException("文件上传失败", e);
        }
    }

    /**
     * 通过HTTP直接下载（生成临时URL）
     *
     * @param fileUrl 文件
     * @return 文件访问 URL
     */
    public static final String generatePresignedUrl(String fileUrl,
                                                    String endpoint,
                                                    String accessKeyId,
                                                    String accessKeySecret,
                                                    String bucketName) {
        // 设置URL过期时间
        Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 生成URL
        String objectName = fileUrl.replace("https://" + bucketName + "." + endpoint + "/", "");

        URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);

        // 关闭OSSClient。
        ossClient.shutdown();

        return url.toString();
    }
}
